﻿
#ifndef _DES_H_
#define _DES_H_

#include <string>
#include <string.h>

// 密文类型
enum enuciph
{
	ECIPHRAW = 0,	// 密文是原文
	ECIPHBIN = 1,	// 密文是二进制
	ECIPHHEX = 2	// 密文是十六进制
};

const int MACCIPHLEN = 8192;

class des
{
	public:
		des(); 
		~des(); 

	public:
		/**********************************************************
		 ** 描述: key初始化函数
		 ** 输入: srcstr 密钥
		 ** 返回: 0 成功, < 0 错误
		 ** ********************************************************/
		int initkey(const char *srcstr);

		/**********************************************************
		 ** 描述: DES加密函数
		 ** 输入: srcstr 原字符串
		 **		  length   字符串长度
		 ** 返回: 0 成功, < 0 错误
		 ** ********************************************************/
		int DESencrypt(const char *srcstr, unsigned int length);

		/**********************************************************
		 ** 描述: DES解密函数
		 ** 输入: dststr 目标字符串
		 **       srcstr 已加密的字符串
		 **       length 加密字符串长度
		 **       type   加密字符串的类型
		 ** 返回: 0 成功, < ０ 错误
		 ** ********************************************************/
		int DESdecrypt(char *dststr, char *srcstr, unsigned int length, enuciph type);

		/**********************************************************
		 ** 描述: 获得转换成可见字符的0或1
		 ** 输入: str 目标字符串
		 ** 返回: 转换后的字符串,　错误 NULL
		 ** ********************************************************/
		char *getciphbin(char *str);

		/**********************************************************
		 ** 描述: 获得密文十六进制
		 ** 输入: str 目标字符串
		 ** 返回: 转换后的字符串,　错误 NULL
		 ** ********************************************************/
		char *getciphhex(char *str);

		/**********************************************************
		 ** 描述: 获得加密后的不可见密文
		 ** 输入: str 目标字符串
		 ** 返回: 目标字符串, 错误 NULL
		 ** ********************************************************/
		char *getciphraw(char *str);

	private:
		/**********************************************************
		 ** 描述: Bytes到Bits的转换
		 ** 输入: dstBits 目标字符串
		 **       srcBytes 原字符串
		 **       srclen 原字符串长度
		 ** 返回: 
		 ** ********************************************************/
		void Bytes2Bits(char *dstBits, const char *srcBytes, unsigned int srclen);

		/**********************************************************
		 ** 描述: Bits到Bytes的转换
		 ** 输入: dstBits 目标字符串
		 **       srcBytes 原字符串
		 **       srclen 原字符串长度
		 ** 返回: 
		 ** ********************************************************/
		void Bits2Bytes(char *dstBytes, const char *srcBits, unsigned int srclen);

		/**********************************************************
		 ** 描述: Int到Bits的转换
		 ** 输入: dstBits 目标字符串
		 **       srcByte 要转换的数字
		 ** 返回: 
		 ** ********************************************************/
		void Int2Bits(char *dstBits, unsigned int srcByte);

		/**********************************************************
		 ** 描述: Bits到Hex的转换
		 ** 输入: dstBits 目标字符串
		 **       srcBytes 原字符串
		 **       srclen 原字符串长度
		 ** 返回: 
		 ** ********************************************************/
		void Bits2Hex(char *dstHex, char *srcBits, unsigned int srclen);

		/**********************************************************
		 ** 描述: Bits到Hex的转换
		 ** 输入: dstBits 目标字符串
		 **       srcBytes 原字符串
		 **       srclen 原字符串长度
		 ** 返回: 
		 ** ********************************************************/
		void Hex2Bits(char *dstBits, char *srcHex, unsigned int srclen);

	private:
		// 功能: 加密8位字符串
		// 参数: 8位字符串
		// 结果: 函数将加密后结果存放于private szCiphertext[16]
		// 用户通过属性Ciphertext得到
		int EncryptData(const char *srcBytes);

		// 功能: 解密16位十六进制字符串
		// 参数: 16位十六进制字符串
		// 结果: 函数将解密候结果存放于private plaintext[8]
		// 用户通过属性Plaintext得到
		int DecryptData(char *srcBytes);

		// 功能: 生成子密钥
		// 参数: 经过PC1变换的56位二进制字符串
		// 结果: 将保存于char subkeys[16][48]
		int CreateSubKey(char *sz_56key);

		// 功能: DES中的F函数,
		// 参数: 左32位,右32位,key序号(0-15)
		// 结果: 均在变换左右32位
		void FunctionF(char *sz_Li, char *sz_Ri, unsigned int iKey);

		// 功能: IP变换
		// 参数: 待处理字符串,处理后结果存放指针
		// 结果: 函数改变第二个参数的内容
		void InitialPermuteData(char *dst, char *src);

		// 功能: 将右32位进行扩展位48位,
		// 参数: 原32位字符串,扩展后结果存放指针
		// 结果: 函数改变第二个参数的内容
		void ExpansionR(char *dst, char *src);

		// 功能: 异或函数,
		// 参数: 待异或的操作字符串1,字符串2,操作数长度,处理后结果存放指针
		// 结果: 函数改变第四个参数的内容
		void XOR(char *szParam1, char *szParam2, unsigned int uiParamLength, char *szReturnValueBuffer);

		// 功能: S-BOX, 数据压缩,
		// 参数: 48位二进制字符串,
		// 结果: 返回结果:32位字符串
		void CompressFuncS(char *dst32, char *src48);

		// 功能: IP逆变换,
		// 参数: 待变换字符串,处理后结果存放指针
		// 结果: 函数改变第二个参数的内容
		void PermutationP(char *dst, char *src);

	private:
		char plainbits[MACCIPHLEN];			// 储存ASCII码48或49(字符0或1)
		char ciphbits[MACCIPHLEN];			// 储存ASCII码0或1
		char subkeys[16][48];				// 储存16组48位密钥
		char ciphraw[64];					// 储存加密不可见的ASCII码密文(64个) 0 or 1
		char plainraw[64];					// 储存解密不可见的ASCII码密文(64个) 0 or 1
		char ciphinbytes[8];				// 储存8位密文
		char plaintext[9];					// 储存8位明文字符串,最后一位存'\0'
		char ciphertext[MACCIPHLEN];		// 任意长度密文
		int ciphertextlen;					// 二进制密文长度
};

#endif

